package com.netx.cubigraf.entities;
import com.netx.data.Connection;
import com.netx.data.DatabaseException;
import com.netx.data.Entity;
import com.netx.data.ValueList;
import com.netx.generics.sql.Row;
import com.netx.generics.sql.Table;
import com.netx.generics.time.Moment;


public class FichasEntrega extends Entity {

	public FichasEntrega() {
	}
	
	// for Servicos:
	// (assumes a transaction has been started)
	void adicionarLinha(long cdgServico, long cdgCliente, boolean facturado) throws DatabaseException {
		// encontrar a ficha de entrega certa para inserir:
		long cdgFicha = 0;
		Table result = select("cdg_ficha_entrega", "cdg_cliente="+cdgCliente+" AND estado='a' AND facturacao="+(facturado ? "1" : "0"));
		if(result.isEmpty()) {
			// criar a ficha de entrega:
			ValueList values = new ValueList();
			values.addValue("cdg_cliente", cdgCliente);
			values.addValue("estado", "a");
			values.addValue("data_criacao", new Moment().getDate());
			values.addValue("facturacao", facturado);
			cdgFicha = insert(values);
		}
		else {
			cdgFicha = result.getLong(1, 0);
		}
		// inserir a linha:
		insertRelation(cdgFicha, cdgServico);
	}
	
	// for Servicos:
	// (assumes a transaction has been started)
	void removerLinha(long cdgServico) throws DatabaseException {
		// remover a linha:
		Table result = getConnection().select("cdg_ficha_entrega FROM linhas_ficha_entrega WHERE cdg_servico="+cdgServico);
		if(!result.isEmpty()) {
			long cdgFicha = result.getLong(1, 0);
			deleteRelation(cdgFicha, cdgServico);
			// remover a ficha de entrega, se vazia:
			result = getConnection().select("cdg_servico FROM linhas_ficha_entrega WHERE cdg_ficha_entrega="+cdgFicha);
			if(result.isEmpty()) {
				delete(cdgFicha);
			}
		}
	}

	public Table verFichasParaEntregar(boolean facturados) throws DatabaseException {
		return getConnection().select("fichas_entrega.cdg_ficha_entrega, clientes.nome, count(linhas_ficha_entrega.cdg_servico) FROM clientes, fichas_entrega, linhas_ficha_entrega WHERE clientes.cdg_cliente=fichas_entrega.cdg_cliente AND linhas_ficha_entrega.cdg_ficha_entrega=fichas_entrega.cdg_ficha_entrega AND fichas_entrega.facturacao="+(facturados ? "1":"0")+" AND fichas_entrega.estado='a' GROUP BY clientes.nome");
	}

	public Row verFichaParaEntregar(long cdgFicha) throws DatabaseException {
		return getConnection().select("fichas_entrega.cdg_ficha_entrega, clientes.nome, count(linhas_ficha_entrega.cdg_servico), fichas_entrega.facturacao FROM clientes, fichas_entrega, linhas_ficha_entrega WHERE clientes.cdg_cliente=fichas_entrega.cdg_cliente AND linhas_ficha_entrega.cdg_ficha_entrega=fichas_entrega.cdg_ficha_entrega AND fichas_entrega.cdg_ficha_entrega="+cdgFicha+" GROUP BY clientes.nome").getRow(0);
	}

	// FICHA
	// 1: codigo da ficha
	// 2: nome completo do cliente
	// 3: data de criacao
	// 4: facturacao
	// LINHAS
	// 1: codigo do servico
	// 2: nome do servico
	// 3: referencia do servico
	// 4: data de abertura
	// 5: numero de cores
	// 6: largura
	// 7: altura
	public Table[] verFichaEntrega(long cdgFicha) throws DatabaseException {
		Connection c = getConnection();
		Table ficha = c.select("fichas_entrega.cdg_ficha_entrega, clientes.nome_completo, fichas_entrega.data_criacao, fichas_entrega.facturacao FROM fichas_entrega, clientes WHERE fichas_entrega.cdg_ficha_entrega="+cdgFicha+" AND clientes.cdg_cliente=fichas_entrega.cdg_cliente");
		Table servicos = c.select("servicos.cdg_servico, servicos.nome, servicos.referencia, servicos.data_abertura, servicos.numero_cores, servicos.largura, servicos.altura FROM servicos, linhas_ficha_entrega WHERE servicos.cdg_servico=linhas_ficha_entrega.cdg_servico AND linhas_ficha_entrega.cdg_ficha_entrega="+cdgFicha);
		return new Table[] {ficha, servicos};
	}
	
	public void criarFicha(long cdgFicha) throws DatabaseException {
		ValueList values = new ValueList();
		values.addValue("data_criacao", new Moment().getDate());
		values.addValue("estado", "c");
		update(cdgFicha, values);
	}
	
}
